package service

/*
// 全局公开对象
var CasbinRule = casbinRuleService{}

// casbin_规则表
// 私有对象，所有的方法都绑定到这个结构体上。
type casbinRuleService struct{}

// 返回一个 *casbin.Enforcer,这个指针能够操作已经持久化到数据中的 casbin_rule 表!
func (p *casbinRuleService) Casbin() *casbin.Enforcer {
	e, _ := casbin.NewEnforcer("./server/config/casbin_rbac_model.conf")
	// 引入自定义匹配规则
	e.AddFunction("ParamsMatch", p.ParamsMatch) // 这个ParamsMatch就是 ./server/config/casbin_rbac_model.conf 文件 [matchers]中的自定义函数
	// 加载规则
	e.LoadPolicy()
	return e
}

// 清除匹配的权限
func (p *casbinRuleService) ClearCasbin(v int, pType ...string) bool {
	e := p.Casbin()
	ok, _ := e.RemoveFilteredPolicy(v, pType...)
	return ok
}

// 获取权限列表
func (p *casbinRuleService) GetPolicyList(authorityId string) (res []dao.CasbinInfo) {
	e := p.Casbin()
	list := e.GetFilteredPolicy(0, authorityId)
	for _, v := range list {
		res = append(res, dao.CasbinInfo{
			Path:   v[1],
			Method: v[2],
		})
	}
	return res
}

// 更新权限api,即:(casbin_rule表中的 v1字段)
func (p *casbinRuleService) UpdateCasbinApi(oldPath, newPath, oldMethod, newMethod string) error {
	str := "update casbin_rule set v1 = ?,v2 = ? where v1 = ? and v2 = ?"
	exec, err := global.DB.Exec(str, newPath, newMethod, oldPath, oldMethod)
	if err != nil {
		return err
	}
	_, err = exec.RowsAffected()
	return err
}

// 批量更新casbin权限 <authorityId>角色Id,
func (p *casbinRuleService) UpdateCasbin(authorityId string, casbinList []dao.CasbinInfo) error {
	p.ClearCasbin(0, authorityId)
	e := p.Casbin()
	rules := make([][]string, 0)
	for _, v := range casbinList {
		cm := dao.CasbinModel{
			Ptype:       "p",
			AuthorityId: authorityId,
			Path:        v.Path,
			Method:      v.Method,
		}
		rules = append(rules, []string{cm.AuthorityId, cm.Path, cm.Method})
	}
	ok, _ := e.AddPolicies(rules) //底层调用的就是这个方法,根据这个方法的参数写出上面的代码
	if !ok {
		return errors.New(" 存在相同的api,添加失败,请联系管理员!")
	}
	return nil
}

//ParamsMatch 自定义规则函数
func (p *casbinRuleService) ParamsMatch(args ...interface{}) (interface{}, error) {
	name1 := args[0].(string)
	name2 := args[1].(string)
	return p.ParamsMatchFunc(name1, name2), nil
}

//ParamsMatchFunc 自定义规则函数
func (p *casbinRuleService) ParamsMatchFunc(fullNameKey1 string, key2 string) bool {
	key1 := strings.Split(fullNameKey1, "?")[0]
	// 剥离路径后再使用casbin的keyMatch2
	return util.KeyMatch2(key1, key2)
}*/
